package com.xia.netty.thread.volatileExp;

public class SingleTest {
    /**
     * 单例加Volatile关键字的主要作用: 避免指令重排生成还没有实例化的对象
     * 实例化对象:1. 在内存中开辟空间
     *          2. 初始化对象
     *          3. 将内存的空间地址赋值给引用的对象
     * 在操作系统可能发生指令重排,多线程下不加Volatile可能会导致返回一个未初始化的对象
     */
    private static volatile SingleTest singleTest;

    private SingleTest() {
    }

    public static SingleTest getInstance() {
        if (singleTest == null) {
            synchronized (SingleTest.class) {
                if (singleTest == null) {
                    singleTest = new SingleTest();
                }
            }
        }
        return singleTest;
    }
}
